<template>
  <section>迭代器模式</section>
</template>

<script>
/**
 * @Description:迭代器模式
 * @author ZY
 * @date 2022/11/23 22:41
 */
export default {
  name: "DesignIterator",
  data() {
    return {}
  },
  created() {
    console.log('*******迭代器模式开始********')
    this.main()
    console.log('*******迭代器模式结束********')
  },
  methods: {
    /*
    * 迭代器模式：提供一种方法顺序一个聚合对象中各个元素，而又不暴露该对象的内部表示。
    * 场景： Array.prototype.forEach
            jQuery中的$.each()
            ES6 Iterator
    * */
    main() {
      class Iterator {
        constructor(conatiner) {
          this.list = conatiner.list
          this.index = 0
        }

        next() {
          if (this.hasNext()) {
            return this.list[this.index++]
          }
          return null
        }

        hasNext() {
          if (this.index >= this.list.length) {
            return false
          }
          return true
        }
      }

      class Container {
        constructor(list) {
          this.list = list
        }

        getIterator() {
          return new Iterator(this)
        }
      }

// 测试代码
      let container = new Container([1, 2, 3, 4, 5])
      let iterator = container.getIterator()
      while (iterator.hasNext()) {
        console.log(iterator.next())
      }
    }
  }
}
</script>

<style scoped>

</style>
